<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<meta name="theme-color" content="#33474d">
	<title>PS出的RSS总和大于实际物理内存 | 失落的乐章</title>
	<link rel="stylesheet" href="/css/style.css" />
	
      <link rel="alternate" href="/atom.xml" title="失落的乐章" type="application/atom+xml">
    
</head>

<body>

	<header class="header">
		<nav class="header__nav">
			
				<a href="/archives" class="header__link">Archive</a>
			
				<a href="/tags" class="header__link">Tags</a>
			
				<a href="/atom.xml" class="header__link">RSS</a>
			
		</nav>
		<h1 class="header__title"><a href="/">失落的乐章</a></h1>
		<h2 class="header__subtitle">技术面前，永远都是学生。</h2>
	</header>

	<main>
		<article>
	
		<h1>PS出的RSS总和大于实际物理内存</h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用ps  aux  查看系统进程时，第六列即 RSS列显示的就是进程使用的物理内存。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可是把系统所有进程的该列相加时，得到的总和又远远高于系统实际的物理内存？这到底是怎么回事呢？</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;看一看linux是如何管理内存的就会知道。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;理解的意思是这样的，linux会在每个进程生成时分配一定量的内存给这个进程，这个只是分配，而体现在ps出来的是VSZ那列，这叫做虚拟内存。但实际上这些进程并没有占用这些内存。不妨，我也借用网上的一个例子来形容一下，就像银行发工资给员工一样，每个员工都有一个自己的银行卡，每月银行都会把固定的钱数打到员工的银行卡里，但是这个过程并不是把实际的钱发到员工手里，只是一串数字而已。实际上，银行并没有那么多钱的。回头再来看看linux给进程分配内存是不是和上面的举的例子很像呢？</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;讲了上面的观点后，依然不能把笔者所设的问题解答，那么继续往下探讨：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;把系统所有进程的该列相加时，得到的总和又远远高于系统实际的物理内存？这是因为 ps 的结果，RSS 那部分，是包括共享内存的。这里使用 pmap 来看看。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">pmap -d 24030</div><div class="line">24030: /usr/<span class="built_in">local</span>/php/bin/php-cgi --fpm --fpm-config /usr/<span class="built_in">local</span>/php/etc/php-fpm.conf</div><div class="line">Address Kbytes Mode Offset Device Mapping</div><div class="line">0000000000400000 6444 r-x-- 0000000000000000 008:00002 php-cgi</div><div class="line">0000000000c4b000 272 rw--- 000000000064b000 008:00002 php-cgi</div><div class="line">0000000000c8f000 52 rw--- 0000000000c8f000 000:00000 [ anon ]</div><div class="line">00000000059dc000 9572 rw--- 00000000059dc000 000:00000 [ anon ]</div><div class="line">0000003519000000 508 r-x-- 0000000000000000 008:00002 libfreetype.so.6.3.10</div><div class="line">000000351907f000 2048 ----- 000000000007f000 008:00002 libfreetype.so.6.3.10</div><div class="line">中间部分省略</div><div class="line">00002b757df75000 4 rw--- 000000000000a000 008:00002 libnss_files-2.5.so</div><div class="line">00002b757df76000 32768 rw<span class="_">-s</span>- 0000000000000000 000:00008 zero (deleted)</div><div class="line">00002b7580685000 4 rw<span class="_">-s</span>- 0000000000000000 000:00008 zero (deleted)</div><div class="line">00007fff2e126000 476 rwx-- 00007fff2e126000 000:00000 [ stack ]</div><div class="line">00007fff2e19d000 8 rw--- 00007fff2e19d000 000:00000 [ anon ]</div><div class="line">ffffffffff600000 8192 ----- 0000000000000000 000:00000 [ anon ]</div><div class="line">mapped: 139548K writeable/private: 12344K shared: 32772K</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pmap是用来显示内存使用的指令，-d 后面跟的是进程id. 关于pmap的使用以及显示的数据请看<a href="http://www.lishiming.net/thread-977-1-1.html" target="_blank" rel="external">http://www.lishiming.net/thread-977-1-1.html</a> </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;linux 会把一些shared libraries 载入到内存中，在pmap 的输出中，这些shared      libraries 的名字通常是 lib*.so ,如 libX11.so.6.2.0 。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个 libX11.so.6.2.0 会被很多process load 到自己的运行环境中，同时，ps 输出的RSS 结果中，每个process 都包含了这个libX11.so.6.2.0 ，而事实上它只被load 了一次，如果单纯把ps 的结果相加，这样就重复计算了。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;看pmap输出的结果，其实php-cgi 单纯进程所占的内存是这个writeable/private: 12344K</p>

	

	
		<span class="different-posts"><a href="/2017/10/12/1. Linux 基础/53. PS出的RSS总和大于实际物理内存/" onclick="window.history.go(-1); return false;">⬅️ Go back </a></span>

	

</article>

	</main>

	<footer class="footer">
	<div class="footer-content">
		
	      <div class="footer__element">
	<p>Hi there, <br />welcome to my Blog glad you found it. Have a look around, will you?</p>
</div>

	    
	      <div class="footer__element">
	<h5>Check out</h5>
	<ul class="footer-links">
		<li class="footer-links__link"><a href="/archives">Archive</a></li>
		
		  <li class="footer-links__link"><a href="/atom.xml">RSS</a></li>
	    
		<li class="footer-links__link"><a href="/about">about page</a></li>
		<li class="footer-links__link"><a href="/tags">Tags</a></li>
		<li class="footer-links__link"><a href="/categories">Categories</a></li>
	</ul>
</div>

	    

		<div class="footer-credit">
			<span>© 2017 失落的乐章 | Powered by <a href="https://hexo.io/">Hexo</a> | Theme <a href="https://github.com/HoverBaum/meilidu-hexo">MeiliDu</a></span>
		</div>

	</div>


</footer>



</body>

</html>
